﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entities;
using System.Data.SqlClient;
using System.Data;
namespace AccesoDatos
{
    public class Domicilios
    {
        public static void Insertar(Domicilio dom, out int idDomicilio)
        {
            idDomicilio = -1;
            if (dom.IdDomicilio == 0)
            {
                //alta
                SqlConnection conexion = DB.Conectar();
                SqlTransaction trans = null;
                try
                {
                    trans = conexion.BeginTransaction();
                    string comando = "INSERT INTO Domicilio (calle, nro, idBarrio) VALUES (@calle,@numero,@barrio)";
                    List<SqlParameter> lstParametros = new List<SqlParameter>();
                    lstParametros.Add(new SqlParameter("@calle", dom.Calle));
                    lstParametros.Add(new SqlParameter("@numero", dom.Nro));
                    lstParametros.Add(new SqlParameter("@barrio", dom.IdBarrio));
                    int filas = DB.EjecutarCommand(comando, lstParametros, conexion, trans);
                    if (filas > 0)
                    {
                        dom.IdDomicilio = ObtenerUltimoID(conexion, trans);
                        idDomicilio = dom.IdDomicilio;
                        trans.Commit();                        
                    }
                }
                catch (Exception)
                {
                    if (trans != null)
                    {
                        trans.Rollback();
                    }
                    throw new Exception("No se pudo registrar el domicilio");
                }
                finally
                {
                    if (conexion != null && conexion.State == ConnectionState.Open)
                        conexion.Close();
                }
            }
            else
            {
                //Modificar
                SqlConnection conexion = DB.Conectar();
                SqlTransaction trans = null;
                try
                {
                    trans = conexion.BeginTransaction();
                    string comando = "UPDATE Domicilio SET calle =@calle, nro =@numero, idBarrio =@barrio WHERE (idDomicilio = @id)";
                    List<SqlParameter> lstParametros = new List<SqlParameter>();
                    lstParametros.Add(new SqlParameter("@calle", dom.Calle));
                    lstParametros.Add(new SqlParameter("@numero", dom.Nro));
                    lstParametros.Add(new SqlParameter("@barrio", dom.IdBarrio));
                    lstParametros.Add(new SqlParameter("@id", dom.IdDomicilio));
                    int filas = DB.EjecutarCommand(comando, lstParametros, conexion, trans);
                    if (filas > 0)
                    {
                        idDomicilio = dom.IdDomicilio;
                        trans.Commit();
                    }
                }
                catch (Exception)
                {
                    if (trans != null)
                    {
                        trans.Rollback();
                    }
                    throw new Exception("No se pudo modificar el domicilio");
                }
                finally
                {
                    if (conexion != null && conexion.State == ConnectionState.Open)
                        conexion.Close();
                }
            }
        }
        public static void Eliminar(Domicilio dom)
        {
            SqlConnection conexion = null;
            SqlTransaction trans = null;
            try
            {
                conexion = DB.Conectar();
                trans = conexion.BeginTransaction();
                string comando = "DELETE FROM Domicilio WHERE  (idDomicilio = @id)";
                List<SqlParameter> lstParametros = new List<SqlParameter>();
                lstParametros.Add(new SqlParameter("@id", dom.IdDomicilio));
                int afectadas = DB.EjecutarCommand(comando, lstParametros, conexion, trans);
                if (afectadas > 0)
                    trans.Commit();                    
            }
            catch (Exception)
            {
                if (trans != null)
                {
                    trans.Rollback();
                }
                throw new Exception("No se pudo dar de baja el domicilio");
            }
            finally
            {
                if (conexion != null && conexion.State == ConnectionState.Open)
                    conexion.Close();
            }
        }
        public static int ObtenerUltimoID(SqlConnection con, SqlTransaction trans)
        {
            int id = -1;
            try
            {
                string comando = "select @@identity FROM domicilio";
                List<SqlParameter> lstParametros = new List<SqlParameter>();
                id = int.Parse(DB.EjecutarScalar(comando,lstParametros,con,trans));
            }
            catch (SqlException ex)
            {
                //Con throw la información de la pila es mas profunda de donde se genero el error
                //En la capa de Presentación se Captura como Exception
                throw new Exception("Hubo un problema al obtener el ultimo ID.", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Hubo un problema al obtener el ultimo ID.", ex);
            }
            return id;
        }
        public static Domicilio BuscarPorId(int id)
        {
            SqlConnection conexion = null;
            Domicilio oDomicilio = null;
            try
            {
                conexion = DB.Conectar();
                string comando = "SELECT idDomicilio, calle, nro, idBarrio FROM Domicilio WHERE (idDomicilio = @id)";
                List<SqlParameter> lstParametros = new List<SqlParameter>();
                lstParametros.Add(new SqlParameter("@id", id));
                SqlDataReader dr = DB.GenerarReader(comando, lstParametros, conexion);
                while (dr.Read())
                {
                    oDomicilio = new Domicilio();
                    oDomicilio.IdDomicilio = (int)dr["idDomicilio"];
                    oDomicilio.Nro = (int)dr["nro"];
                    oDomicilio.Calle = dr["calle"].ToString();
                    oDomicilio.IdBarrio = (int)dr["idBarrio"];
                }
            }
            catch (SqlException ex)
            {
                //Con throw la información de la pila es mas profunda de donde se genero el error
                //En la capa de Presentación se Captura como Exception
                throw new Exception("Hubo un problema al cargar el domicilio.", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Hubo un problema al cargar el domicilio.", ex);
            }
            finally
            {
                conexion.Close();
            }
            return oDomicilio;
        }
    }
}
